using BarManager.Core.ApplicationService.Interfaces;
using BarManager.Core.Entity;
using BarManager.UI.Web.Caching;
using BarManager.UI.Web.HtmlHelpers;
using BarManager.UI.Web.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

namespace BarManager.UI.Web.Controllers
{
    [Authorize(Users = "admin")]
    public class PromocionController : BaseController<PromocionViewModel, Promocion, int>
    {
        private ICategoriaService CategoriaService { get; set; }
        private IProductoService ProductoService { get; set; }

        public PromocionController(IPromocionService service, ICategoriaService categoriaService,
            IProductoService productoService)
            : base(service)
        {
            this.CategoriaService = categoriaService;
            this.ProductoService = productoService;
        }

        [HttpGet]
        public override ActionResult Index(int id = 0)
        {
            PromocionViewModel model = new PromocionViewModel
            {
                Categorias = CategoriaService.GetAllCategoriasContainsProductos()
                                             .OrderBy(x => x.Nombre)
            };

            if (id > 0)
            {
                model.Entity = Service.Get(x => x.Id == id);
                CacheManager.Set("PromocionViewModel", model);
                CacheManager.Set("PromocionDetalle", model.Entity.PromocionDetalleList);
            }

            return View(model);
        }

        [HttpGet]
        public override ActionResult List(string filter, int page = 1)
        {
            CacheManager.Clear();
            PromocionViewModel model = new PromocionViewModel
            {
                Entities = this.Service.Find(x => filter == null || x.Descripcion.Contains(filter))
                                        .OrderBy(x=> x.Descripcion)
                                        .Skip((page - 1) * PageSize)
                                        .Take(PageSize),
                PagingInfo = new PagingInfo
                {
                    CurrentPage = page,
                    ItemsPerPage = PageSize,
                    TotalItems = this.Service.Find(x => filter == null || x.Descripcion.Contains(filter))
                                             .Count()
                }
            };
            model.Filter = filter;     
            return View(model);
        }

        [HttpPost]
        public override ActionResult Save(PromocionViewModel model)
        {
            //- Cargamos combo Categorias
            if (model.Categorias == null) model.Categorias = CategoriaService.GetAllCategoriasContainsProductos().OrderBy(x => x.Nombre);
            
            //- Obtenemos y seteamos detalle en cache
            List<PromocionDetalle> detalle = CacheManager.Get<List<PromocionDetalle>>("PromocionDetalle");
            model.Entity.PromocionDetalleList = detalle;
            
            //- Guardamos o actualizamos
            if (model.Entity.Id == 0)
                ErrorList = Service.Add(model.Entity);
            else
                ErrorList = Service.Update(model.Entity);
            return ShowError(model, ErrorList);
        }

        [HttpGet]
        public ActionResult Activas(int page = 1)
        {
            CacheManager.Clear();
            PromocionViewModel model = new PromocionViewModel();

            model.Entities = (Service as IPromocionService).GetAllActivas();
            model.PagingInfo = new PagingInfo
               {
                   CurrentPage = page,
                   ItemsPerPage = PageSize,
                   TotalItems = model.Entities.Count()
               };
            return View("List", model);
        }

        [HttpGet]
        [ActionName("FillProductoJson")]
        public JsonResult FillProducto(int id)
        {
            var productos = ProductoService.GetAllProductosByCategoria(id)
                                        .Select(x => new { Id = x.Id, Nombre = x.Nombre })
                                        .OrderBy(x => x.Nombre);
            return this.Json(productos, JsonRequestBehavior.AllowGet);
        }

        [HttpPost]
        public PartialViewResult DetalleAdd(PromocionViewModel model)
        {
            //- Creamos nuevo item
            PromocionDetalle item = new PromocionDetalle
            {
                Cantidad = model.Cantidad,
                Producto = ProductoService.GetAllProductosByCategoria(model.CategoriaId).FirstOrDefault(x => x.Id == model.ProductoId),
                ProductoId = model.ProductoId
            };

            //- Cachamos items agregados
            if (!CacheManager.IsSet("PromocionDetalle"))
            { CacheManager.Set("PromocionDetalle", new List<PromocionDetalle>()); }

            //- Agregamos items al detalle si es que ya no existe
            if (!CacheManager.Get<List<PromocionDetalle>>("PromocionDetalle").Exists(x => x.ProductoId == item.ProductoId))
                CacheManager.Get<List<PromocionDetalle>>("PromocionDetalle").Add(item);

            //- Actualizamos el detalle en cabecera y metemos en sesion al model
            model.Entity.PromocionDetalleList = CacheManager.Get<List<PromocionDetalle>>("PromocionDetalle");
            CacheManager.Set("PromocionViewModel", model);

            //- Devolvemos el model solo al detalle para refrezcar grilla
            return PartialView("_PromocionDetalle", CacheManager.Get<PromocionViewModel>("PromocionViewModel"));
        }

        [HttpPost]
        public PartialViewResult DetalleRemove(int idProducto, int cantidad)
        {
            //- Eliminamos el Item
            CacheManager.Get<List<PromocionDetalle>>("PromocionDetalle")
                .RemoveAll(x => x.ProductoId == idProducto && x.Cantidad == cantidad);

            //- Actaulizamos los datos
            CacheManager.Get<PromocionViewModel>("PromocionViewModel").Entity.PromocionDetalleList
                = CacheManager.Get<List<PromocionDetalle>>("PromocionDetalle");

            //- Devolvemos el model solo al detalle para refrezcar grilla
            return PartialView("_PromocionDetalle", CacheManager.Get<PromocionViewModel>("PromocionViewModel"));
        }

    }
}
